package tool

// by daoyi
import (
	"bytes"
	"encoding/json"
	"errors"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

// curl请求示例
func curl请求示例() {

	//get请求
	// https://test.pet-dbc.cn/api/user/info?name=yuyu
	params := map[string]string{
		"name": "yuyu",
	}
	res, err := Pcurl("https://test.pet-dbc.cn/api/user/info", "GET",
		params, nil, nil)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(res)

	//post请求示例
	herders := map[string]string{
		"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyMywiZXhwIjoxODc1MDAwNTI2LCJpc3MiOiJkYmMifQ.Jxw5fwgT2GJDVM3gXLPqv01L2hi7Uf_HjM7F70AopRs",
	}
	type Data struct {
		UserId      int64 `json:"user_id"`
		OrderStatus int64 `json:"order_status"`
		PageSizeNum int64 `json:"page_size_num"`
		Current     int64 `json:"current"`
	}
	data := Data{16, 0, 10, 1}
	body, _ := json.Marshal(data)
	res, err = Pcurl("https://test.pet-dbc.cn/api/user/info", "POST",
		nil, herders, body)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(res)
}

// curl请求
// 支持任意方式的http请求
// url 请求地址
// method 请求方式
// headers 请求header头设置
// params 请求地址栏后需要拼接参数操作（get请求，所需参数）
// data 请求报文（post 请求，所需参数）
// Return 返回类型 "错误信息"
func Pcurl(url, method string, params, headers map[string]string, data []byte) (interface{}, error) {

	//自定义cient
	client := &http.Client{
		Timeout: 5 * time.Second, // 超时时间：5秒
	}
	//http.post等方法只是在NewRequest上又封装来了一层而已
	req, err := http.NewRequest(method, url, bytes.NewBuffer(data))
	if err != nil {
		log.Println(err)
		return nil, errors.New("new request is fail: %v \n")
	}
	//请求头，修改请求头
	req.Header.Set("Content-type", "application/json")

	//请求参数 params
	q := req.URL.Query()
	if params != nil {
		for key, val := range params {
			q.Add(key, val)
		}
		req.URL.RawQuery = q.Encode()
	}

	//请求头添加到 headers
	if headers != nil {
		for key, val := range headers {
			req.Header.Add(key, val)
		}
	}

	//开启客户端请求
	resp, err := client.Do(req) //  默认的resp ,err :=  http.DefaultClient.Do(req)
	if err != nil {
		log.Println(err)
		return nil, err
	}
	//关闭客户端请求（放到最后执行）
	defer resp.Body.Close()
	//读取并存到内存中
	body, err := ioutil.ReadAll(resp.Body)

	//定义空的map
	temp := make(map[string]interface{}, 0)

	//将字符串转换为数据结构
	err = json.Unmarshal(body, &temp)

	if err != nil {
		log.Println(err)
		return nil, err
	}
	return temp, nil
}
